home *** CD-ROM | disk | FTP | other *** search
/ TPUG - Toronto PET Users Group / TPUG Users Group CD / TPUG Users Group CD.iso / AMIGA / AMICUS / AMIBEST1.ADF / AmigaBasicStuff / RatMaze < prev    next >
Text File  |  1987-07-22  |  9KB  |  300 lines

  1.  
  2. '  Program history
  3. '  ---------------
  4. '  Originally by:                       Brian Mccarson
  5. '  Modified to run under AppleSoft by:  Tom Mornini
  6. '  Modified to run under AmigaBasic by: Randy Manchester 70775,1424
  7. '  Originally appeared in Kilobaud Microcomputing
  8. '  April 1981
  9.           
  10. SCREEN 1,640,200,3,2
  11. WINDOW 2,,,0,1
  12. WINDOW 3,"RatMaze!",(0,0)-(410,186),0,1
  13. PALETTE 4,.2,.2,.2
  14. COLOR 1,4
  15. CLS
  16.  
  17. WINDOW OUTPUT 2
  18. yc1 = 10      
  19. yc2 = 15
  20. x = 515: y = 94 ' start of left arrow
  21.   COLOR 3
  22.   LINE (x,y)-STEP(-30,0)    ' draw left arrow
  23.   LINE -STEP(0,-3)
  24.   LINE -STEP(-10,5)
  25.   LINE -STEP(10,5)
  26.   LINE -STEP(0,-3)
  27.   LINE -STEP(30,0)
  28.   LINE -STEP(0,-4)
  29.   PAINT STEP(-2,2),3
  30.   LINE (x+15,y)-STEP(30,0)  ' draw left arrow
  31.   LINE -STEP(0,-3)
  32.   LINE -STEP(10,5)
  33.   LINE -STEP(-10,5)
  34.   LINE -STEP(0,-3)
  35.   LINE -STEP(-30,0)
  36.   LINE -STEP(0,-4)
  37.   PAINT STEP(2,2),3
  38.   
  39.   LOCATE yc1
  40.   PRINT PTAB(x-8)"MOVE";
  41.   LOCATE yc2
  42.   PRINT PTAB(x-8)"VIEW";
  43.                               
  44.   WINDOW OUTPUT 3
  45.             
  46. 100  zz =  FRE (0)
  47. 200  GOTO 6400
  48. 300  '    draw 3d view at h,v
  49. 400  ' 
  50. 500  '   h,v=current location
  51. 600  '   s,r=facing (f)
  52. 700  '   a,b=looking coordinates
  53.  
  54. 800   n = 2:a = h:b = v:ff = 2 ^ (f - 1)
  55. 900   CLS
  56. 1000  z = m(a,b) * ff
  57. 1100  REM   left side
  58. 1200  IF  FN m(z / 16) = 0 THEN 1500
  59. 1300  rl =  - 1: GOSUB 5100
  60. 1400  GOTO 1900
  61. 1500  REM   left back
  62. 1600  w = m(a + s,b - r) * ff
  63. 1700  IF  FN m(w / 128) = 0 THEN 1900
  64. 1800  rl =  - 1: GOSUB 4400
  65. 1900  REM   right side
  66. 2000  IF  FN m(z / 64) = 0 THEN 2300
  67. 2100  rl = 1: GOSUB 5100
  68. 2200  GOTO 2700
  69. 2300  REM   right back
  70. 2400  w = m(a - s,b + r) * ff
  71. 2500  IF  FN m(w / 128) = 0 THEN 2700
  72. 2600  rl = 1: GOSUB 4400
  73. 2700  REM   back test
  74. 2800  IF  FN m(z / 128) = 1 THEN 3300
  75. 2900  REM   next level
  76. 3000  n = n + 1: IF n > 8 THEN 3500
  77. 3100  a = a + r:b = b + s: IF b < 2 THEN 3500
  78. 3200  GOTO 1000
  79. 3300  REM   back end
  80. 3400  GOSUB 3600
  81. 3500  RETURN 
  82. 3600  REM    center back subroutine
  83. 3700  REM     n=distance
  84.       
  85. 3800  PSET (vx + dx(n),yu(n))
  86. 3900  LINE -(vx + dx(n),yd(n))
  87. 4000  LINE -(vx - dx(n),yd(n))
  88. 4100  LINE -(vx - dx(n),yu(n))
  89. 4200  LINE -(vx + dx(n),yu(n))
  90.       
  91. 4300  RETURN 
  92. 4400  REM    back side subroutine
  93. 4500  REM   rl=back side
  94.       
  95. 4600  PSET (vx + rl * dx(n - 1),yu(n))
  96. 4700  LINE -(vx + rl * dx(n),yu(n))
  97. 4800  LINE -(vx + rl * dx(n),yd(n))
  98. 4900  LINE -(vx + rl * dx(n - 1),yd(n))
  99.       
  100. 5000  RETURN 
  101. 5100  REM   side subroutine
  102. 5200  REM   n=distance
  103. 5300  REM    rl=which side (-1,+1)
  104.       
  105. 5400  PSET (vx + rl * dx(n - 1),yu(n - 1))
  106. 5500  LINE -(vx + rl * dx(n),yu(n))
  107. 5600  LINE -(vx + rl * dx(n),yd(n))
  108. 5700  LINE -(vx + rl * dx(n - 1),yd(n - 1))
  109.       
  110. 5800  IF n > 2 THEN  LINE -(vx + rl * dx(n - 1),yu(n - 1))
  111. 5900  RETURN 
  112. 6000  REM   error sound subroutine
  113.             BEEP
  114.  
  115. 6300  RETURN 
  116. 6400  RANDOMIZE TIMER
  117. 6500  DEF  FN m(x) =  INT (x) -  INT ( INT (x) / 2) * 2
  118. 6600  fx = 36: INPUT "please enter maze size (h,v) ";h,v: PRINT 
  119. 6700  h =  INT (h):v =  INT (v)
  120. 6800  IF h > 2 AND h < 31 AND v > 2 AND v < 31 THEN 7000
  121. 6900  PRINT "2<h<31 --  2<v<31": GOSUB 6000: GOTO 6600
  122. 7000  n = h * v - 1:h = h + 1:v = v + 1:d = 1:nm = 0
  123.       IF switch THEN ERASE m,w
  124. 7100  DIM m(32,32),w(400) : switch = 1
  125. 7200  FOR j = 1 TO v + 1:m(1,j) = 4:m(h + 1,j) = 1: NEXT j
  126. 7300  mx = 403:my = 183:vx = INT (mx / 2):vy = INT (my / 2):x = vx
  127. 7400  REM   compute perspective points
  128. 7500  FOR j = 1 TO 8:dx(j) = x:yu(j) =  INT (vy - x * vy / vx)
  129. 7600  yd(j) =  INT (vy + x * (my - vy) / vx):x =  INT (x * 7 / 10): NEXT j
  130. 7700  FOR i = 2 TO h:m(i,v + 1) = 8:m(i,1) = 2
  131. 7800  FOR j = 2 TO v:m(i,j) = 15: NEXT j,i
  132. 7900  REM  
  133. 8000  REM   8 = top wall
  134. 8100  REM   4 = right wall
  135. 8200  REM   2 = bottom wall
  136. 8300  REM   1 = left wall
  137. 8400  REM   
  138. 8500 r =  INT (h / 2 + 1):s =  INT (v / 2 + 1):m(r,s) = 15
  139. 8600  PRINT "generating maze.": GOSUB 6000
  140. 8700  REM   generate maze
  141. 8800  REM   algorithm from rogers and strassberger
  142. 8900  FOR iw = 1 TO n
  143. 9000 i = 0
  144. 9100  IF m(r - 1,s) < 15 THEN 9300
  145. 9200   i = i + 1:c(i) = 1
  146. 9300   IF m(r,s - 1) < 15 THEN 9500
  147. 9400   i = i + 1:c(i) = 2
  148. 9500   IF m(r + 1,s) < 15 THEN 9700
  149. 9600   i = i + 1:c(i) = 3
  150. 9700   IF m(r,s + 1) < 15 THEN 9900
  151. 9800   i = i + 1:c(i) = 4
  152. 9900   IF i = 0 THEN 12300
  153. 10000  IF i <  > 1 THEN i =  INT ( RND (1) * i) + 1
  154. 10100  ON c(i) GOTO 10300,10800,11300,11800
  155. 10200  REM   move west
  156. 10300  m(r,s) = m(r,s) -  FN m(m(r,s))
  157. 10400  r = r - 1
  158. 10500  m(r,s) = m(r,s) -  FN m(m(r,s) / 4) * 4
  159. 10600  GOTO 13400
  160. 10700  REM   move north
  161. 10800  m(r,s) = m(r,s) -  FN m(m(r,s) / 8) * 8
  162. 10900  s = s - 1
  163. 11000  m(r,s) = m(r,s) -  FN m(m(r,s) / 2) * 2
  164. 11100  GOTO 13400
  165. 11200  REM   move east
  166. 11300  m(r,s) = m(r,s) -  FN m(m(r,s) / 4) * 4
  167. 11400  r = r + 1
  168. 11500  m(r,s) = m(r,s) -  FN m(m(r,s))
  169. 11600  GOTO 13400
  170. 11700  REM   move south
  171. 11800  m(r,s) = m(r,s) -  FN m(m(r,s) / 2) * 2
  172. 11900  s = s + 1
  173. 12000  m(r,s) = m(r,s) -  FN m(m(r,s) / 8) * 8
  174. 12100  GOTO 13400
  175. 12200  REM   scan for unused point
  176. 12300  IF d =  - 1 THEN 12700
  177. 12400  IF r <  > h THEN 13100
  178. 12500  IF s <  > v THEN 13000
  179. 12600  r = 2:s = 2: GOTO 13200
  180. 12700  IF r <  > 2 THEN 13100
  181. 12800  IF s <  > v THEN 13000
  182. 12900  r = h:s = 2: GOTO 13200
  183. 13000  s = s + 1:d =  - d: GOTO 13200
  184. 13100  r = r + d
  185. 13200  IF m(r,s) = 15 THEN 12300
  186. 13300  GOTO 9000
  187. 13400  NEXT iw
  188. 13500  mh = h:mv = v
  189. 13600  REM   random point at south for starting point
  190. 13700 i =  INT ( RND (1) * (mh - 1)) + 2
  191. 13800 m(i,1) = 0
  192. 13900 m(i,2) = m(i,2) -  FN m(m(i,2) / 8) * 8
  193. 14000 h =  INT ( RND (1) * (mh - 1)) + 2
  194. 14100 h1 = h:v1 = v
  195. 14200  GOSUB 6000
  196. 14300  PRINT "maze completed.": GOSUB 6000
  197. 14400  GOTO 16900
  198. 14500  REM   display top view of maze
  199. 14600  REM   calculate display scale
  200. 14700 hz =  INT (mx / mh):vz =  INT (my / mv)
  201. 14800  CLS
  202. 14900  PSET (1 + hz,1 + vz)
  203. 15000  LINE -(1 + hz,mv * vz + 1)
  204. 15100  FOR j = 1 TO mv: FOR i = 2 TO mh
  205. 15200 n = m(i,j):x = i * hz + 1:y = j * vz + 1
  206. 15300  IF  FN m(n / 2) = 0 THEN 15700
  207. 15400  REM   draw south wall
  208. 15500  PSET (x,y)
  209. 15600  LINE -(x - hz,y)                 
  210. 15700  IF  FN m(n / 4) = 0 THEN 16100
  211. 15800  REM   draw east wall
  212. 15900  PSET (x,y)
  213. 16000  LINE -(x,y - vz)
  214. 16100  NEXT i,j
  215. 16200  REM   mark rat's position
  216. 16300 x = h * hz - 1:y = v * vz - 1
  217.       COLOR 3 
  218. 16400  PSET (x + 1,y + 1)
  219. 16500  LINE -(x - hz + 2,y - vz + 2)
  220. 16600  PSET (x - hz + 2,y + 1)
  221. 16700  LINE -(x + 1,y - vz + 2)
  222.        COLOR 1,4
  223. 16800  RETURN 
  224. 16900  REM   add redundant bits
  225. 17000  FOR x = 1 TO mh: FOR y = 1 TO mv
  226. 17100 m(x,y) = m(x,y) + m(x,y) * 16
  227. 17200  NEXT y,x
  228. 17300  REM   play the game
  229. 17400  REM   initial direction
  230. 17500 f =  INT ( RND (1) * 4) + 1
  231. 17600  ON f GOTO 17700,17800,17900,18000
  232. 17700 r = 0:s =  - 1: GOTO 18100
  233. 17800 r = 1:s = 0: GOTO 18100
  234. 17900 r = 0:s = 1: GOTO 18100
  235. 18000 r =  - 1:s = 0
  236. 18100  GOSUB 300
  237. 18200  ' Get player's next move
  238.  
  239. 18300  IF MOUSE(0) = 0 THEN GOTO 18300
  240.          mox = MOUSE(5)
  241.          moy = MOUSE(6)
  242.          IF mox > 474 AND mox < 516 AND moy > 82 AND moy < 90 THEN 19000
  243.          IF mox > 529 AND mox < 571 AND moy > 82 AND moy < 90 THEN 19300
  244.          IF mox > 507 AND mox < 540 AND moy > 70 AND moy < 80 THEN 20000
  245.          IF mox > 507 AND mox < 540 AND moy > 110 AND moy < 120 THEN 21200
  246.          GOTO 18300
  247.  
  248. 18900  GOSUB 6000: GOTO 18300
  249. 19000  REM   left <-
  250. 19100 f = f - 1: IF f < 1 THEN f = 4
  251. 19200  GOTO 19500
  252. 19300  REM   right ->
  253. 19400 f = f + 1: IF f > 4 THEN f = 1
  254. 19500  ON f GOTO 19600,19700,19800,19900
  255. 19600 r = 0:s =  - 1: GOTO 21000
  256. 19700 r = 1:s = 0: GOTO 21000
  257. 19800 r = 0:s = 1: GOTO 21000
  258. 19900 r =  - 1:s = 0: GOTO 21000
  259. 20000  REM    forward
  260. 20100 z = m(h,v)
  261. 20200 t = z * 2 ^ (f - 1):t =  FN m(t / 128)
  262. 20300  IF t = 0 THEN 20600
  263. 20400  REM   bumped into wall
  264. 20500  GOSUB 6000: GOTO 18300
  265. 20600 nm = nm + 1
  266.       WINDOW OUTPUT 2
  267.       LOCATE 23
  268.       PRINT PTAB(510)"MOVE "nm
  269.       WINDOW OUTPUT 3
  270. 20700  IF nm < 400 THEN w(nm) = f
  271. 20800 h = h + r:v = v + s
  272. 20900  IF v < 2 THEN 21500
  273. 21000  GOSUB 300
  274. 21100  GOTO 18300
  275. 21200  REM   cheat
  276. 21300  GOSUB 14500
  277.        
  278. 21400  GOTO 18300
  279. 21500  WINDOW OUTPUT 3:CLS : PRINT "congrats, it took you "nm" steps."
  280.        FOR zzz = 0 TO 6000:NEXT zzz
  281. 21600  GOSUB 6000: GOSUB 6000: GOSUB 6000
  282. 21700 v = v1:h = h1: GOSUB 14500
  283. 21800  REM   draw path walked
  284. 21900 x =  INT (h * hz - hz / 2) + 1:y =  INT (v * vz - vz / 2) + 1
  285.       COLOR 3
  286. 22000  PSET (x,y)
  287. 22100  FOR n = 1 TO nm
  288. 22200  IF n > 400 THEN 22900
  289. 22300 f = w(n)
  290. 22400  IF f = 1 THEN v = v - 1
  291. 22500  IF f = 2 THEN h = h + 1
  292. 22600  IF f = 3 THEN v = v + 1
  293. 22700  IF f = 4 THEN h = h - 1
  294. 22800  LINE -(INT (h * hz - hz / 2) + 1, INT (v * vz - vz / 2) + 1)
  295. 22900  NEXT n
  296.        COLOR 1,4
  297. 23000  IF MOUSE(0) = 0 THEN 23000
  298.        GOTO 6400
  299.  
  300.